package com.lmz.project.multitudethread.interrupttest;


public class TestStop {

    /**
     * 验证一般情况下使用interrupt 中断线程的例子
     */
    public static void threadStopTest() {
        Thread testThread = new Thread(new Runnable() {
            @Override
            public void run() {
                //第一种情况: 检测是否收到中断信令，收到返回true，并清除当前的线程状态，重新变更为未中断
                int i = 0;
                System.out.println(Thread.currentThread().isInterrupted());
                while (!Thread.interrupted()) {
//                    System.out.println("线程内代码执行--" + (++i));
                }
                //此时在检测当前该线程是否收到外界中断信令，得到结果为false，因为使用Thread.interrupted()，在收到中断信令后，会清除当前线程的状态，所以此处进行判断时返回结果为false，线程状态未收到中断信令

                System.out.println(Thread.currentThread().isInterrupted());
            }
        });

        testThread.start();
        try {
            Thread.sleep(1000);
            System.out.println(testThread.isInterrupted());
            //等待5s后，发出中断信号，通知testThread线程进行中断
            testThread.interrupt();
            System.out.println(testThread.isInterrupted());
            boolean flag = true;
            int index = 0;
            Thread.sleep(1000);
            while (flag) {
                System.out.println("检测线程中断信号: " + testThread.isInterrupted());
                //循环检测10s，10s后跳出循环
                Thread.sleep(1000);
                index++;
                if (index == 10) {
                    //停止检测
                    flag = false;
                }
            }

            if (!testThread.isInterrupted()) {
                System.out.println("外部检测testThread中断完成");
            } else {
                System.out.println("外部检测testThread中断失败");
            }

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 验证线程中断，抛出InterruptedException异常的情况
     */
    public static void threadStopTest2() {
        /**
         * 当外部调用对应线程进行中断的信令时，如果此时该执行线程处于被阻塞状态，如；Thread.sleep()，Object.wait()，BlockingQueue#put、BlockingQueue#take 等
         * 那么此时通过调用当前线程对象的interrupt方法触发这些函数抛出InterruptedException异常。
         * 当一个函数抛出InterruptedException异常时，表示这个方法阻塞的时间太久了，外部应用不想等它执行结束了。
         * 当你的捕获到一个InterruptedException异常后，亦可以处理它，或者向上抛出。
         *
         * 抛出时要注意？？？：当你捕获到InterruptedException异常后，当前线程的中断状态已经被修改为false；
         * 此时你若能够处理中断，正常结束线程，则不用理会该值；但如果你继续向上抛InterruptedException异常，你需要再次调用interrupt方法，将当前线程的中断状态设为true。
         *
         */
    }


    public static void main(String[] args) {
        threadStopTest();
    }

}
